package com.example.controller;

import com.example.common.Result;
import com.example.entity.SplitDTO;
import com.example.service.UploadService;
import com.example.service.NiiFileService;
import com.example.service.UploadService;
import com.example.utils.OSSUtil;
import com.example.utils.SendAsyncMessagesUtil;
import com.example.utils.TempFileUtil;
import com.sun.istack.NotNull;
import org.dromara.x.file.storage.core.FileInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.nio.file.Path;
import java.util.UUID;

/**
 * 文件相关操作接口
 */
@RestController
@RequestMapping("/files")
public class FileController {

    @Autowired
    private UploadService uploadService;
    @Autowired
    NiiFileService niiFileService;
    @Autowired
    private SendAsyncMessagesUtil sendAsyncMessagesUtil;

    /**
     * 上传文件到OSS，并且存储UUID至MySQL中
     * 头像存储在/avatar/中，nii文件存储于/nii/中
     *
     * @param file
     * @return
     */
    @PostMapping("/upload")
    public Result uploadNii(@NotNull MultipartFile file) throws IOException {
        String extname = OSSUtil.getExtname(file);
        if (".nii".equals(extname) || ".nii.gz".equals(extname)) {
            // 上传文件到 OSS，获取文件信息
            FileInfo fileInfo = uploadService.uploadNiiFile(file);

            // 将.nii文件转存到临时文件中，nii_path
            Path niiDest = TempFileUtil.createTempFile("temp", ".nii");
            file.transferTo(niiDest);

            /** TODO
             * 融入AI的主要流程是：获取到历史目录niiDest中的文件
             * 调度matlab脚本提取其特征值，输出的文件名为datas.csv（根目录为user.dir），里面为1*120个数字特征
             * 将其读出出来，并且和best_svm_model.pkl（已经拟合好的模型文件）一起导入execute_the_model文件
             * 得出拟合后的结果，将该结果传递给客户端
            */

            //生成消息唯一UUID
            String messageId = UUID.randomUUID().toString();
            // 生成文件唯一标识符
            String seed = UUID.randomUUID().toString();

            // 构建 SplitDTO，只传递文件 URL
            SplitDTO splitDTO = new SplitDTO(messageId, seed, file.getOriginalFilename(), niiDest);

            // 异步发送消息到消息队列
            sendAsyncMessagesUtil.sendUploadPngAsyncMessage(splitDTO);

            fileInfo.setThUrl(seed); // 保存种子信息

            return Result.success(fileInfo);
        } else {
            // 其他文件类型处理
            return Result.success(uploadService.uploadAvatar(file));
        }
    }

}
